package org.javahispano.javacup.tacticas_aceptadas.sjvc.SubTacticasAtaque;
import org.javahispano.javacup.modelo.*;

import org.javahispano.javacup.tacticas_aceptadas.sjvc.Comandos;
import org.javahispano.javacup.tacticas_aceptadas.sjvc.SituacionPartidoSergio;
import org.javahispano.javacup.tacticas_aceptadas.sjvc.SubTacticaAtaque;


import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class STAPaseAlMamon extends SubTacticaAtaque {

	protected int indiceJugadorMasRapido;
	protected Posicion posicionVentajosa;
	protected int kJugadoresAPorElBalon = 2;
	
	public STAPaseAlMamon(){
		indiceJugadorMasRapido = -1;
	}
	
	@Override
	protected List<Comando> _ejecutar(SituacionPartido sp, SituacionPartidoSergio spAnterior) {
		
		List<Comando> comandos = new LinkedList<Comando>();
		
		//Obtener el mejor jugador si aun no sabemos quien es
		if(indiceJugadorMasRapido == -1)
			indiceJugadorMasRapido = JugadorMasRapido(sp);
		
		//Durante el partido, la posicion "ventajosa" cambia
		if(posicionVentajosa == null || sp.iteracion() % (Constantes.ITERACIONES/8) == 0)
			posicionVentajosa = new Posicion( (new Random().nextInt(2) % 2 == 0 ? -1 : 1) * Constantes.ANCHO_CAMPO_JUEGO/(2 + new Random().nextDouble()*2), Constantes.LARGO_CAMPO_JUEGO/(2 + new Random().nextDouble()*2)); 
			
		//El jugador mas rapido corre hacia la posicion "ventajosa"
		comandos.add(new ComandoIrA(indiceJugadorMasRapido, posicionVentajosa));
		
		//Si tenemos el control del balon...
		int indiceMasCercano = sp.balon().indiceMasCercano(sp.misJugadores());
		if(sp.balon().distancia(sp.misJugadores()[indiceMasCercano]) <= Constantes.DISTANCIA_CONTROL_BALON){
			
			//Si tiene el balon el mejor jugador ira regateando hasta entrar dentro de la porteria
			if(indiceMasCercano == indiceJugadorMasRapido){				
				//S estoy cerquisima de la l�nea_de_meta.Y la posici�n X est� encima de la porter�a, chuto hacia dentro
				if(Math.abs(sp.balon().getX()) <= Math.abs(Constantes.posteDerArcoSup.getX()) && Math.abs(sp.balon().getY()) >= Math.abs(Constantes.posteDerArcoSup.getY()) - 15 )
					comandos.add(new ComandoGolpearBalon(indiceJugadorMasRapido, new Posicion(sp.misJugadores()[indiceJugadorMasRapido].getX(), Constantes.centroArcoSup.getY()*2), 1, false));
				else{//Si no estoy cerqu�sima me acerco m�s
					comandos.add(new ComandoGolpearBalon(indiceJugadorMasRapido));
				}
				comandos.add(new ComandoIrA(indiceJugadorMasRapido, Constantes.centroArcoSup));
			}
			//Sino, si el mejor jugador esta cerca entonces ira el solito a por el balon
			else if(sp.balon().distancia(sp.misJugadores()[indiceJugadorMasRapido]) <= Constantes.DISTANCIA_PENAL)
				comandos.add(new ComandoIrA(indiceJugadorMasRapido, sp.balon()));
			//Si no, si tiene el balon uno que no es el mejor jugador, se la pasa a este o chuta si esta cerca de la porteria
			else if(indiceMasCercano != indiceJugadorMasRapido)
				Comandos.Pase(sp, indiceMasCercano, indiceJugadorMasRapido, comandos);	
			//Si el jugador con el balon esta cerca, chutara a porteria
			else if(sp.misJugadores()[indiceMasCercano].distancia(Constantes.centroArcoSup) < Constantes.DISTANCIA_PENAL)
				comandos.add(new ComandoGolpearBalon(indiceMasCercano, Constantes.centroArcoSup, 1, false));

		}
		else{ //Si no tenemos el control del balon
			//Si el mejor jugador es el mas cercano va a por el, sino
			//los mas cercanos al balon corren a por el
			
			if(indiceMasCercano == indiceJugadorMasRapido)
				comandos.add(new ComandoIrA(indiceJugadorMasRapido, sp.balon()));
			else
				Comandos.IrAPorElBalon(sp, kJugadoresAPorElBalon, comandos, indiceJugadorMasRapido);
		}
		
		return comandos;
	}
	
	protected int JugadorMasRapido(SituacionPartido sp){
		
		int jugadorMasRapido = 10;
		
		for(int i = 1;i<11;i++){
			if(sp.detalleMisJugadores()[i].getVelocidad() > sp.detalleMisJugadores()[jugadorMasRapido].getVelocidad()){
				jugadorMasRapido = i;
			}
		}
		
		return jugadorMasRapido;
	}
}